#include "UART.h"
#include "NVIC.h"
#include "Switch.h"
#include "RTX51TNY.H"

#include "rocker.h"
#include "bluetooth.h"
#include "matrix_keys.h"
#include "vibrate_motor.h"


#define TASK_MAIN                0
#define TASK_ROCKER              1  // 摇杆数据获取任务
#define TASK_BT_CONNECT          2  // 蓝牙连接指定从机任务
#define TASK_MATRIX_KEKS         4  // 矩阵按键
#define TASK_LISTEN_SLAVER       5  // 监听从机数据


void UART_Config(){
	/*
	  串口配置 -- 对应的IO会默认配置，不需要专门为串口配P3.0, P3.1
	  在串口配置之前的打印等使用串口的操作不会生效
	 */
	// 配置P3.0, P3.1
	COMx_InitDefine uart_init;
	/*
	  UART_ShiftRight: 按位移动输出，按位传输，效率较低
	  UART_8bit_BRTx： 8位数据传输，可变波特率（bps）
	  UART_9bit		： 9位数据传输，固定波特率（bps）
	  UART_9bit_BRTx： 9位数据传输，可变波特率（bps），最后一位为求校验位
	 */
	uart_init.UART_Mode = UART_8bit_BRTx;			//模式
	uart_init.UART_BRT_Use = BRT_Timer1;    // 波特率发生器BRT_Timer1 ~ 4
	uart_init.UART_BaudRate = 115200;		//波特率, 	   一般 110 ~ 115200
	uart_init.Morecommunicate = DISABLE;	//多机通讯允许, ENABLE,DISABLE
	uart_init.UART_RxEnable = ENABLE;		//允许接收,   ENABLE,DISABLE
	uart_init.BaudRateDouble = DISABLE;		//波特率加倍, ENABLE,DISABLE
	UART_Configuration(UART1, &uart_init);
	
	// uart中断使能
	NVIC_UART1_Init(ENABLE, Priority_1);
	
	// uart需要打开对应的开关才能使用
	UART1_SW(UART1_SW_P30_P31);
}


// 获取摇杆角度任务
void task_rocker() _task_ TASK_ROCKER {
	int angle_right;
	u8 car_signal;
	u8 last_car_signal = CAR_STOP;
	
	Rocker_init();
	bluetooth_init();
	os_wait1(K_SIG);

	while(1){
		// 获取摇杆角度
		get_rocker_angle_right(&angle_right);
		
		// 摇杆角度转化为小车信号
		angle_2_car_signal(&car_signal);
		
		// 防止信号重复发送，
		if(car_signal != last_car_signal){
			last_car_signal = car_signal;
			// 发送小车信号给小车
			//printf("%#x\n", car_signal);
			TX4_write2buff(car_signal);
		}
		os_wait2(K_TMO, 10);
	}
}


void key_down_fun(u8 row, u8 col){
	// 判断按下的是什么键，调用具体任务
	
	// 按中间按钮启动蓝牙连接指定从机
	if(row * 10 + col == BTN_CENTER){
//		printf("连接从机蓝牙");
		bt_connect(BT_1);
	}
	
	// 按开始按钮小车开始接收蓝牙数据
	if(row * 10 + col == BTN_START){
//		printf("开始发送蓝牙数据");
		// 不要在这里开启任务有时候会有BUG
		os_send_signal(TASK_ROCKER);
	}
	
	// 按上键发送加速信号
	if(row * 10 + col == BTN_UP){
		TX4_write2buff(CAR_SPEED_UP);
	}
	
	// 按下键发送减速信号
	if(row * 10 + col == BTN_DOWN){
		TX4_write2buff(CAR_SLOW_DOWN);
	}
	
	// 按下A键发送打开超声波模块信号
	if(row * 10 + col == BTN_A){
		TX4_write2buff(CAR_ULTRASONIC);
	}
	
	// 按下B键小车开始鸣笛
	if(row * 10 + col == BTN_B){
		//printf("%#X\n", CAR_BUZZER_START);
		TX4_write2buff(CAR_BUZZER_START);
	}
}


void key_up_fun(u8 row, u8 col){
	// B键弹起小车停止鸣笛
	if(row * 10 + col == BTN_B){
		//printf("%#X\n", CAR_BUZZER_STOP);
		TX4_write2buff(CAR_BUZZER_STOP);
	}
}


//void task_bluetooth_rev() _task_ 3 {
////		listen_bt();
//	bluetooth_init();
//	while(1){
//		
//		uart1_2_uart4();
//		uart4_2_uart1();

//		os_wait2(K_TMO, 10);
//	}
//}


void task_matrix_keys() _task_ TASK_MATRIX_KEKS {
	
	GPIO_Matrix_Key_Config();
	bluetooth_init();
	while(1){
		polling_keys(key_down_fun, key_up_fun);
		os_wait2(K_TMO, 5);
	}
}


void task_listen_slaver() _task_ TASK_LISTEN_SLAVER {
	u8 last_key_en = 1;
	
	bluetooth_init();
	vibrate_motor_init();
//	printf("监听从机");
	while(1){
		if (COM4.RX_TimeOut > 0 && --COM4.RX_TimeOut == 0){
			if(COM4.RX_Cnt > 0){
//				printf("RX4_Buffer=%#x\n", RX4_Buffer[0]);
				if(RX4_Buffer[0] == CAR_ULTR_SIGNAL){
//					printf("motor_vibrate_start");
					// 调用震动马达
					motor_vibrate_start();
					os_wait2(K_TMO, 50);
					motor_vibrate_stop();
					os_wait2(K_TMO, 50);
					motor_vibrate_start();
					os_wait2(K_TMO, 50);
					motor_vibrate_stop();
				}
			}
			COM4.RX_Cnt = 0;
		}
		
		// 蓝牙底板上的按钮可以拉低EN引脚，如果检测到EN低电平发送断开连接
		if(BT_EN_PIN == 0 && last_key_en == 1){
			bt_disconnect();
			last_key_en = 0;
		}
		if(BT_EN_PIN == 1){
			last_key_en = 1;
		}
		os_wait2(K_TMO, 5);
	}
}


void task_main() _task_ TASK_MAIN {
	EA = 1;
	UART_Config();
	// 获取摇杆电位器角度任务
	os_create_task(TASK_ROCKER);
	
	// 蓝牙发送数据任务
	os_create_task(TASK_BT_CONNECT);
	//os_create_task(3);
	
	// 按键任务
	os_create_task(TASK_MATRIX_KEKS);
	
	// 监听从机信号任务
	os_create_task(TASK_LISTEN_SLAVER);
	
	// 结束0任务不会终止已经在这里启动的其他任务
	os_delete_task(0);
}


/*
  蓝牙主机需要写代码来查找从机，匹配从机
  这个过程，不同的状态需要外在的灯或者声音或者震动提示
 */
